package Libs.Utils
{
	import Libs.Dados.Objetos.Endereco;
	import Libs.Dados.Objetos.Telefone;
	
	import mx.core.UIComponent;
	import mx.printing.FlexPrintJob;
	
	public class Util
	{
		public function Util()
		{
		}
		
		public static function ValidarCpfCnpj(cpfCnpj:String):Boolean
		{
			var retorno:Boolean=false;
			switch(cpfCnpj.length)
			{
				case 11:
				{
					retorno=ValidarCPF(cpfCnpj);
					break;
				}
				
				case 14:
				{
					retorno=ValidarCNPJ(cpfCnpj);
					break;
				}
				
				default :
				{
					retorno = false;
					break;
				}
			}
			return retorno;
		}
		
		private static function ValidarCPF(cpf:String):Boolean
		{
			var Peso1:Array = [10, 9, 8, 7, 6, 5, 4, 3, 2];
			var Peso2:Array = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2];
			var resultado:Boolean =  false;
			// criamos um string ( expressÃ£o ) para "pegarmos" o valor digitado
			if (cpf.length == 11)
			{
				var cpfVal:String = cpf;		
				var j:int = 0;
				// criamos as variÃ¡veis que nos auxiliarÃ£o no cÃ¡lculo dos dÃ­gitos verificadores
				var soma1:Number = new Number ();
				var resto1:Number = new Number ();
				var soma2:Number = new Number ();
				var resto2:Number = new Number ();
				var digito2:Number = 0;
				// utilizamos o for com o incremento i ( i++ )
				var i:int = 0;
				
				var digito1:Number = 0;
				for (i = 0; i < Peso1.length; i++)
				{
					soma1 += Number(cpfVal.charAt(i)) * Peso1[i];
				}
				
				resto1 = soma1 % 11;
				// criamos a condicÃ£o para o caso do resultado ser menor ou igual a 1
				if (resto1 <= 1) 
				{	
					digito1 = 0; // se for o digito verificador Ã© igual a 0 ( zero )
				} 
				else 
				{		
					digito1 = 11 - resto1;// senÃ£o Ã© igual a 11 menos o resto
				}
				// agora o cÃ¡lculo do segundo dÃ­gito que segue o mesmo padrÃ£o anterior
				
				for (j = 0; j < Peso2.length; j++)
				{
					soma2 += Number(cpfVal.charAt(j)) * Peso2[j];
				}
				
				resto2 = soma2 % 11;
				
				if (resto2 <= 1)
				{
					digito2 = 0;
				} 
				else
				{
					digito2 = 11 - resto2;
				}
			
				if (((Number(cpfVal.charAt(9)) == digito1)&& (Number(cpfVal.charAt(10))) == digito2) && (cpfVal.length == 11)) 
				{
					resultado = true;
				} 
			}
						
			return resultado;
		}
		
		private static function ValidarCNPJ(cnpjPassado:String):Boolean 
		{
			var resultado:Boolean = false;
			if (cnpjPassado.length == 14)
			{
				var CNPJ:String = new String();
				CNPJ = cnpjPassado;
				var i:int = 0;		
				var a:Array = new Array;
				var b:Number = new Number();
				var c:Array = new Array (6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2);		
				var x:int;
				var y:int;
				
				for (i=0; i<12; i++)
				{
					a[i] = CNPJ.charAt(i);
					b += a[i]*c[i+1];
				}
				
				if ((x=b%11)<2)
			    {
					a[12] = 0;
				} 
				else 
				{
					a[12] = 11-x;
				}
				
				b = 0;
				
				for (y=0; y<13; y++)
				{
					b += (a[y]*c[y]);
				}
				
				if ((x=b%11)<2)
				{
					a[13] = 0;
				} 
				else 
				{
					a[13] = 11-x;
				}
				
				if ((CNPJ.charAt(12) == a[12]) && (CNPJ.charAt(13) == a[13]))
				{
					resultado=true;
				}
				else
				{
					resultado=false;
				}
			}		
			return resultado;
		}
		
		public static function CpfCnpjMascarado(cpfCnpj:String):String
		{
			var retorno : String;
			if(cpfCnpj.length > 0)
			{
				switch(cpfCnpj.length)
				{
					case 11://"Física"
					{
						retorno = cpfCnpj.substr(0,3)+"."+cpfCnpj.substr(3,3)+"."+cpfCnpj.substr(6,3)+"-"+cpfCnpj.substr(9,2);
						break;
					}
					
					case 14://"Jurídica"
					{
						retorno = cpfCnpj.substr(0,2)+"."+cpfCnpj.substr(2,3)+"."+cpfCnpj.substr(5,3)+"/"+cpfCnpj.substr(8,4)+"-"+cpfCnpj.substr(12,2);
						break;
					}
					
					case 12://CEI
					{
						retorno = cpfCnpj.substr(0,10)+"-"+cpfCnpj.substr(10,2);
						break;
					}
					
					default : 
					{
						retorno = cpfCnpj;
						break;
					}
				}
			}
			return retorno;
		}
		
		public static function UltimoDiaMes(source:Date):int 
		{
			var dia:int;
			dia = new Date(source.fullYear, source.month + 1, 0).dateUTC;
			return dia;
		}
		
		public static function Imprimir(print:UIComponent, flexPrintJobScaleType:String):void 
		{
            // Create an instance of the FlexPrintJob class.
            var printJob:FlexPrintJob = new FlexPrintJob();
			
            // Start the print job.
            if (printJob.start() != true) return;

            // Add the object to print. Do not scale it.
            printJob.addObject(print,flexPrintJobScaleType);

            // Send the job to the printer.
            printJob.send();
       	}
	
		public static function TelefoneMascarado(telefone:Libs.Dados.Objetos.Telefone):String
		{
			var retorno:String;
			if(telefone != null)
			{
				retorno = telefone.CodigoDeArea != 0 ?"( "+ telefone.CodigoDeArea +" ) ": "(  ) ";
				
				if((telefone.Numero != null)&&(telefone.Numero.length == 8))
				{
					retorno += telefone.Numero.substr(0,4);
					retorno += "-";
					retorno += telefone.Numero.substr(4,8);
				}
				else
				{
					retorno += telefone.Numero;
				}
				
			}
			return retorno;
		}
		
		public static function EnderecoMascarado(endereco:Libs.Dados.Objetos.Endereco):String
		{
			var retorno:String;
			if((endereco != null)&&(endereco.Logradouro != null)&&(endereco.Logradouro.TipoLogradouro != null)&&(endereco.Logradouro.Bairro != null))
			{
				retorno = endereco.Logradouro.TipoLogradouro.Descricao;
				retorno += " ";
				retorno += endereco.Logradouro.Descricao;
				retorno += " - ";
				retorno += endereco.Logradouro.Bairro.Descricao;
				retorno += ", ";
				retorno += endereco.Numero;
			}
			return retorno;
		}
		
		public static function CidadeEstadoEndereco(endereco:Libs.Dados.Objetos.Endereco):String
		{
			var retorno:String;
			if((endereco != null)&&(endereco.Logradouro != null)&&(endereco.Logradouro.Bairro != null)&&(endereco.Logradouro.Bairro.Cidade != null)&&(endereco.Logradouro.Bairro.Cidade.UnidadeFederativa != null))
			{
				retorno = endereco.Logradouro.Bairro.Cidade.Descricao;
				retorno += " - ";
				retorno += endereco.Logradouro.Bairro.Cidade.UnidadeFederativa.Codigo;
			}
			return retorno;
		}
		
		public static function CepMascarado(endereco:Libs.Dados.Objetos.Endereco):String
		{
			var retorno:String;
			if((endereco != null)&&(endereco.Logradouro != null)&&(endereco.Logradouro.Cep.length == 8))
			{
				retorno = endereco.Logradouro.Cep.substr(0,5) + "-" + endereco.Logradouro.Cep.substr(5,8);
			}
			return retorno;
		}		
		
		public function ObterEnderecoServidor(enderecoCompleto:String):String
		{
			while((enderecoCompleto.substring(enderecoCompleto.length - 1, enderecoCompleto.length) != "/"))
			{
				enderecoCompleto = 	enderecoCompleto.substring(0, enderecoCompleto.length - 1)
			}
			
			return enderecoCompleto;
		}  
	}
}